package com.cfc.stage1;

import org.junit.Test;

/**
 * @description:  位1的个数
 *   https://leetcode.cn/problems/number-of-1-bits/description/
 * @author: yangxuan10
 * @create: 2024-04-17 13:32
 **/
public class HammingWeight {

    @Test
    public void test1() {
//        System.out.println(hammingWeight1(2));
//        int a  = ~0;
//        System.out.println(a);

//        System.out.println(Integer.toBinaryString(3));

        System.out.println(1 & 1000);
    }

    /**
     * 学习一种思路
     * @param n
     * @return
     */
    public int hammingWeight3(int n) {
        /*
            &  按位与  都为 1 就是 1 否则结果为 0
            |  按位或  都为 0 就是 0 否则结果为 1
            ^  按位异或  相同则为 0 ，不同结果为：1 （两数相同 用按位与 那么结果就是 0）
            
            ~  取反
            >> 右移几位
            << 左移几位
        */
        int mask = 1;
        int count = 0;
        // int类型最多 32位了呢
        for(int i = 0; i < 32; i++)
        {
            if((n & mask) != 0)  // 都为 1 就是 1 否则结果为 0
                count++;
            mask <<= 1; //左移 1位
        }
        return count;
    }

    /**
     * 学习一种思路
     * @param n
     * @return
     */
    public int hammingWeight1(int n) {
        int x = 0;
        //将10进制转换成2进制字符串
        String toBinaryString = Integer.toBinaryString(n);
        char[] charArray = toBinaryString.toCharArray();
        for (int i = 0; i < charArray.length; i++) {
            if ('1' == charArray[i]) {
                x++;
            }
        }
        return x;
    }

    /**
     * 原创：我的最快了呀
     *
     * @param n
     * @return
     */
    public int hammingWeight(int n) {
        //十进制转换为二进制
        // 11 / 2 = 5 余  1
        // 5  / 2 = 2 余  1
        // 2  / 2 = 1 余  0
        // 1  / 2 = 0 余  1
        // 因此11 的二进制 = 1011

        //二进制转换为十进制
        // 2^3 = 8
        // 0^2 = 0
        // 2^1 = 2
        // 2^0 = 1

        int x = 0;
        while(n > 0) {
            if (n % 2 == 1) {
                x++;
            }
            n = n / 2;
        }
        return x;
    }

}